package com.eddie.juc.locks;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;

/**
 * 题目：谈谈对多线程锁的理解，8锁案例说明
 * 口诀：线程 操作 资源类
 * 1、标准访问有ab两个线程，请问先打印邮件还是短信
 * 2、sendEmail方法中加入暂停三秒钟，请问先打印邮件还是短信
 * 3、添加一个普通的Hello方法，请问先打印邮件还是hello
 * 4、有两部手机，请问先打印邮件还是短信
 * 5、有两个静态同步方法，有一部手机，请问先打印邮件还是短信
 * 6、有两个静态同步方法，有两部手机，请问先打印邮件还是短信
 * 7、有一个静态同步方法，有一个普通同步方法，有一部手机，请问先打印邮件还是短信
 * 8、有一个静态同步方法，有一个普通同步方法，有2部手机，请问先打印邮件还是短信
 *
 * @author Eddie
 * @date 2022/08/18 12:27
 **/
public class Lock8Demo {
    /**
     * 一切程序的入口
     */
    @SneakyThrows
    public static void main(String[] args) {
        Phone phone = new Phone();
        Phone phone2 = new Phone();
        new Thread(() -> {
            phone.sendEmail();
        }, "a").start();
        //暂停毫秒，保证a线程先启动
        TimeUnit.MILLISECONDS.sleep(200);
        new Thread(() -> {
            phone2.sendSMS();
        }, "b").start();
    }
}

/**
 * 资源类
 */
class Phone {
    @SneakyThrows
    public static synchronized void sendEmail() {
        TimeUnit.SECONDS.sleep(3);
        System.out.println("------sendEmail------");
    }

    public synchronized void sendSMS() {
        System.out.println("------sendSMS------");
    }

    public void hello() {
        System.out.println("Hello");
    }
}
